#include "STC8G.H"
#include "intrins.h"
#include "delay.h"
#include "hardiic.h"
#define uchar unsigned char
#define uint unsigned int

#define ADDR 0X4E
//**********************LCD1602**************************
/**
 * @brief	通过IIC写一个数据到1602液晶上
 * @param	dat:
 * @retval	None
 */
void WriteData(uchar dat)
{
        hardiic_start();         //发送起始命令
        hardiic_send_byte(ADDR); //发送设备地址+写命令
        hardiic_wait_ack();
        hardiic_send_byte(dat); //发送命令
        hardiic_wait_ack();
        hardiic_stop();
}
/**
 * @brief	通过IIC写一个数据到1602液晶上
 * @param	com:将要被写入的命令
 * @retval	None
 */
void write_com(uchar com) //写命令函数
{
        uchar com1, com2;
        com1 = com | 0x0f;
        WriteData(com1 & 0xfc);
        delay2ms();
        WriteData(com1 & 0xf8);
        com2 = com << 4;
        com2 = com2 | 0x0f;
        WriteData(com2 & 0xfc);
        delay2ms();
        WriteData(com2 & 0xf8);
}
/**
 * @brief	通过IIC写一个数据到1602液晶上
 * @param	date:将要被写入的数据
 * @retval	None
 */
void write_date(uchar date) //写数据函数
{
        uchar date1, date2;
        date1 = date | 0x0f;
        WriteData(date1 & 0xfd);
        delay2ms();
        WriteData(date1 & 0xf9);
        date2 = date << 4;
        date2 = date2 | 0x0f;
        WriteData(date2 & 0xfd);
        delay2ms();
        WriteData(date2 & 0xf9);
}
/**
 * @brief	初始化LCD1602
 * @param	date:将要被写入的数据
 * @retval	None
 */
void LcdInit()
{
        write_com(0x33); //显示模式设置
        delay6ms();
        write_com(0x32); //显示模式设置
        delay6ms();
        write_com(0x28); //4位总线，双行显示，显示5×7的点阵字符
        delay6ms();
        write_com(0x01); //清屏
        delay6ms();
        write_com(0x06); //字符进入模式：屏幕不动，字符后移
        delay6ms();
        // write_com(0x0c); //显示开，关光标
        write_com(0x0f); //显示开,开光标,光标闪烁
        delay6ms();
}
/**
 * @brief	显示字符串
 * @param	x:1,2 y:1,2  str输出内容
 * @retval	None
 */
void ShowString(unsigned char x, unsigned char y, unsigned char *str)
{

        if (x == 1)
        {
                write_com(0x80 | y - 1);
        }
        if (x == 2)
        {
                write_com(0xc0 | y - 1);
        }
        //输出字符串

        while (*str != '\0')
        {
                write_date(*str);
                str++;
        }
}
void main()
{
        uchar i = 0;
        uchar str[8];
        hardiic_init(4);
        LcdInit();
        ShowString(1, 1, "test");
        while (1)
        {
                write_com(0x01); //清屏
                str[i] = i + '0';
                write_date(str[i]);
                if (i > 4)
                {
                        ShowString(2, 5, str);
                }
                if (i > 8)
                {
                        ShowString(1, 5, str);
                        i = 0;
                        delay(100);
                }
                i++;
        }
}
